package cn.good.yan.b14.c2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * b14  反射
 *   动态代理
 *       需要实现 InvocationHandler 接口
 * @author shengren.yan
 * @create 2023-08-02
 */
public class Test2 implements InvocationHandler {

    // 目标对象
    private Object target;

    public Test2(){
    }

    public Test2(Object object){
        this.target = object;
    }

    // 动态生成代理对象
//    public Object newOBJ(Object obj){
//        this.target = obj;
//        // 参数1：指代理类由哪个类加载器加载
//        // 参数2：指代理类实现哪些接口 （与目标对象一致）
//        // 参数3：实现 InvocationHandler 接口的实现类实例，可执行invoke方法
//        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
//    }

    // 参数 代理对象、方法、参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理之前");
        Object invoke = method.invoke(target, args); // 返回对象
        System.out.println("代理之后");
        return invoke;
    }

    // 测试使用
    public static void main(String[] args) {
        // 代理对象， 先执行了 代理之前 ， 然后执行自己的方法，再执行 代理之后
        TestService customer = new TestServiceImpl();
        InvocationHandler proxyHandler = new Test2(customer);
        TestService proxy = (TestService) Proxy.newProxyInstance(
                customer.getClass().getClassLoader(),
                customer.getClass().getInterfaces(),
                proxyHandler);
        proxy.doProcess();

    }
}
